package com.system.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import com.frame.ar.kit.ObjKit;
import com.frame.ar.model.JFinalModel;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

/**
 * @author LRC
 * @createDate 2015年5月21日
 * @description 系统用户模型层
 */
public class User extends JFinalModel<User> {
	/**
	 * 版本ID 1L
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 存储处于锁定状态的用户登录名
	 */
	private static Set<String> lockedUser = new TreeSet<>();
	/**
	 * 线程绑定用户，操作共享，在请求到达时设置，整个操作过程共享
	 */
	private static ThreadLocal<User> us = new ThreadLocal<User>();
	/**
	 * 实例化公共数据操作层对象
	 */
	public static final User dao = new User();

	/**
	 * @updateTeim 2015年5月22日下午11:38:19
	 * @description 获取当前登录用户
	 * @return
	 */
	public static User getCurrentUser() {
		return us.get();
	}
	
	/**
	 * @updateTeim 2015年5月25日上午12:53:16
	 * @description 为当前线程绑定用户
	 * @param user
	 */
	public static void setCurrentUser(Object user){
		if(user!=null && user instanceof User){
			us.set((User)user);
		}else{
			us.set(null);
		}
	}
	
	/**
	 * @updateTeim 2015年6月3日下午2:13:30
	 * @description 返回当前用户ID 
	 * @return
	 */
	public int getCurrUserID(){
		User user = us.get();
		if(user!=null){
			return user.getInt("id");
		}else{
			return 0;
		}
	}
	/**
	 * @updateTeim 2015年5月23日上午12:39:37
	 * @description 根据用户登录名获取用户是否在被锁集合对象中
	 * @param userCode
	 * @return
	 */
	public boolean isLocked(String userCode){
		return lockedUser.contains(userCode);
	}
	
	/**
	 * @updateTeim 2015年5月23日上午12:40:35
	 * @description 将被锁用户从锁定池中释放
	 * @param userCode
	 */
	public void unLocked(String userCode){
		lockedUser.remove(userCode);
		//更新用户状态为解锁
		//Db.update("update sys_base_user set status=1,loginFailedNum=0,lockTime=null where userCode=?", userCode);
	}
	
	/**
	 * @updateTeim 2015年5月23日上午12:47:48
	 * @description 锁定用户
	 * @param userCode 被锁定用户的登录名
	 * @param loginFailedNum 登录失败次数
	 */
	public void lockUser(String userCode){
		lockedUser.add(userCode);
		//锁定用户
		//Db.update("update sys_base_user set status=2,loginFailedNum=?,lockTime=? where userCode=?", loginFailedNum,new Date(),userCode);
	}
	
	/**
	 * @updateTeim 2015年5月30日上午11:33:35
	 * @description 判断当前用户是否为管理员 
	 */
	public boolean isManager(){
		User user = us.get();
		String role = user.getStr("userType");
		if("manager".equals(role)){
			return true;
		}else{
			return false;
		}
	}
	/*******************************************
	 * 功能描述：根据登录名查找用户 
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param userCode
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public User findByUserCode(String userCode){
		if(userCode==null||"".equals(userCode.trim()))
			return null;
		String sql = "select * from sys_base_user where userCode=?";
		return dao.findFirst(sql, userCode);
	}
	
	/*******************************************
	 * 功能描述： 通过用户ID获取用户的菜单id信息
	 *******************************************
	 * @createDate 2015-9-19 by LRC
	 * @param userId
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public List<Integer> getUserMenuId(Object userId,Boolean isOnlyLeaf){
		if(ObjKit.isNull(userId))return null;
		String sql;
		if(isOnlyLeaf){
			sql = "select a.menuId from sys_base_usermenu a join sys_base_menu m on m.id=a.menuId where a.userId=?";
		}else{
			sql = "select menuId from sys_base_usermenu where userId=?";
		}
		List<Record> menuIds = Db.find(sql, userId);
		List<Integer> ids = new ArrayList<Integer>();
		for(Record r : menuIds){
			Integer id = r.get("menuId");
			ids.add(id);
		}
		return ids;
	}
	
}
